﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Windows.Forms;

namespace AvaProvi
{
    [Serializable]
    public class clsConstruccion_CRN:clsEstado,IControlEstados
    {
        private double dbGradoTConst;
        private double dbGradoTAComunes;
        public string DescAComunes { get; set; }
        public clsTerreno_CRN Terreno { get; set; }
        public string DescAPrivativas { get; set; }
        public string AnioTerminaObra { get; set; }
        public double IndivisoConstruccion { get; set; }
        public bool ConstTerminada { get; set; }
        public bool AComunesTerminadas { get; set; }
        public double GradoTConst
        {
            get { return dbGradoTConst; }
            set
            {
                if (value > 1 || value < 0)
                {
                    MessageBox.Show("El grado de terminación de la construcción debe de estar en un rango de 0 y 1", "Grado de Terminación Inválido",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                    dbGradoTConst = 0;
                }
                else
                    dbGradoTConst = value;
            }
        }
        public double GradoTAComunes
        {
            get { return dbGradoTAComunes; }
            set
            {
                if (value > 1 || value < 0)
                {
                    MessageBox.Show("El grado de terminación de las Áreas Comunes debe de estar en un rango de 0 y 1", "Grado de Terminación Inválido",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                    dbGradoTAComunes = 0;
                }
                else
                    dbGradoTAComunes = value;
            }
        }
        public double SupAComunes { get; set; }
        public double SupAPrivativas { get; set; }
        public decimal SuperficieTotalDeConstruccion
        {
            get
            {
                decimal total = 0;
                if (TiposDeConstruccion != null)
                {
                    total = Convert.ToDecimal(this.Terreno.AnalisisFisico.SuperficieVendible);
                    if (total == 0)
                    {
                        total = this.SuperficieDeTerreno;
                    }
                }
                return total;
            }
        }
        public decimal SuperficieDeTerreno
        {
            get
            {
                if (this.Terreno.FraccionesDeTerreno.Count > 0)
                {
                    clsFraccionDeTerreno_CRN objFraccion = this.Terreno.FraccionesDeTerreno[0];
                    return Convert.ToDecimal(objFraccion.Superficie) * objFraccion.Indiviso;
                }
                return 0;
            }
        }
        public BindingList<clsTipoDeConstruccion_CRN> TiposDeConstruccion { get; set; }


        public clsConstruccion_CRN(clsTerreno_CRN objTerreno):base()
        {
            this.AComunesTerminadas = false;
            this.AnioTerminaObra = string.Empty;
            this.ConstTerminada = false;
            this.DescAComunes = string.Empty;
            this.DescAPrivativas = string.Empty;
            this.GradoTAComunes = 0;
            this.GradoTConst = 0;
            this.IndivisoConstruccion = 0;
            this.Terreno = objTerreno;
            this.SupAComunes = 0;
            this.SupAPrivativas = 0;
            this.TiposDeConstruccion = new BindingList<clsTipoDeConstruccion_CRN>();
        }

        public void ConvertirAnuevo()
        {
            this.EsNuevo = true;
            foreach (clsTipoDeConstruccion_CRN tipoConstruccion in this.TiposDeConstruccion)
            {
                tipoConstruccion.EsNuevo = true;
            }
        }

        #region Métodos

        public bool Guardar()
        {
            if (this.DatosValidos())
            {
                if (this.EsNuevo)
                    return CreaConstruccion();
                else
                {
                    if (this.EsModificado)
                        return ModificaConstruccion();
                    else
                        return EliminaCosntruccion();
                }
            }
            return false;
        }

        private bool EliminaCosntruccion()
        {
            clsConstruccion_CD objConstruccion_CD = new clsConstruccion_CD();
            return objConstruccion_CD.EliminaConstruccion(this);
        }

        private bool ModificaConstruccion()
        {
            clsConstruccion_CD objConstruccion_CD = new clsConstruccion_CD();
            if (objConstruccion_CD.ModificaConstruccion(this))
            {
                foreach (clsTipoDeConstruccion_CRN objTipoConstruccion in this.TiposDeConstruccion)
                {
                    objTipoConstruccion.Guardar();
                }
                return true;
            }
            return false;
        }

        private bool CreaConstruccion()
        {
            clsConstruccion_CD objConstruccion_CD = new clsConstruccion_CD();
            if (objConstruccion_CD.CreaConstruccion(this))
            {
                this.EsModificado = true;
                foreach (clsTipoDeConstruccion_CRN objTipoConstruccion in this.TiposDeConstruccion)
                {
                    objTipoConstruccion.Guardar();
                }
                this.TiposDeConstruccion = clsTipoDeConstruccion_CRN.RecuperaTiposDeCosntruccion(this);
                return true;
            }
            return false;
        }

        public bool DatosValidos()
        {
            if (((this.GradoTAComunes > 1) || (this.GradoTAComunes < 0)) || ((this.GradoTConst > 1) || (this.GradoTConst < 0)))
            {
                MessageBox.Show("El grado de terminación debe estar en el rango de 0 a 1.\nCorrija sus datos", "Información inválida", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            return true;
        }

        public static clsConstruccion_CRN RecuperaConstruccion(clsTerreno_CRN objTerreno)
        {
            clsConstruccion_CD objConstruccion_CD = new clsConstruccion_CD();
            clsConstruccion_CRN objConstruccion = new clsConstruccion_CRN(objTerreno);
            dsConstruccion.ConstruccionRow ConstruccionRecuperada = objConstruccion_CD.RecuperaCosntruccion(objTerreno.Inmueble.Avaluo.IdAvaluo);
            if (ConstruccionRecuperada != null)
            {
                objConstruccion.AComunesTerminadas = ConstruccionRecuperada.AcomunesTerm;
                objConstruccion.AnioTerminaObra = ConstruccionRecuperada.AnioTerminaObra;
                objConstruccion.ConstTerminada = ConstruccionRecuperada.ConstTerminada;
                objConstruccion.DescAComunes = ConstruccionRecuperada.DescAComunes;
                objConstruccion.DescAPrivativas = ConstruccionRecuperada.DescAPrivativas;
                objConstruccion.EsModificado = true;
                objConstruccion.GradoTAComunes = ConstruccionRecuperada.GradoTAComunes;
                objConstruccion.GradoTConst = ConstruccionRecuperada.GradoTConst;
                objConstruccion.IndivisoConstruccion = ConstruccionRecuperada.IndivisoConstruccion;
                objConstruccion.SupAComunes = ConstruccionRecuperada.SupAComunes;
                objConstruccion.SupAPrivativas = ConstruccionRecuperada.SupAPrivativas;
                objConstruccion.TiposDeConstruccion = clsTipoDeConstruccion_CRN.RecuperaTiposDeCosntruccion(objConstruccion);
            }
            return objConstruccion;
        }
        #endregion
    }
}
